﻿
using System;
using System.Linq.Expressions;
using Behavioral.Private;

namespace Behavioral
{
    namespace Private
    {
        public interface IInitializationFluent
        {
            IInitializationFluent And<TInitializer>(params object[] constructorParameters)
                where TInitializer : IInitializerMarker;
        }
    }

    public interface IInitializationFluent<TTarget>
    {
        IInitializationFluent<TTarget> WithContext(Action<dynamic> contextSetter);

        IInitializationFluent<TTarget> And<TInitializer>(params object[] constructorParameters)
            where TInitializer : IInitializerMarker;

        IExpectationFluent<TTarget> When<TAction>(params object[] constructorParameters)
            where TAction : IActionable;
    }

    public interface IInitializationFluent<TTarget, TReturnType>
    {
        IInitializationFluent<TTarget, TReturnType> And<TInitializer>(params object[] constructorParameters)
            where TInitializer : IInitializerMarker;

        IExpectationFluent<TTarget, TReturnType> When<TAction>(params object[] constructorParameters)
            where TAction : IActionable;
    }
}
